ELK 日志采集使用

第三方组件声明

因依赖于第三方版本,请第三方组件、中间件和本文保持一致,避免由于第三方升级的兼容性导致无法正常使用。

ELK架构图

ELK 即 Elasticsearch、Logstash、Kibana 的组合,可以搭建分布式日志系统。在微服务架构中,ELK 能够集中管理和分析各个服务的日志,提供强大的日志查询和统计能力。

本文以 PIGX 的 UPMS 模块为例,演示如何整合 ELK 日志采集系统。

ELK 组件说明

ELK 是三个开源组件的首字母缩写,各组件职责如下:

组件作用说明
Elasticsearch日志存储与检索分布式搜索引擎,用于存储和检索日志数据
Logstash日志采集与转发接收应用程序发送的日志,并转发至 Elasticsearch
Kibana日志可视化查询提供 Web 界面,用于查询和分析日志

部署 ELK 环境

1. 编写 Docker Compose 配置文件

创建 docker-compose.yml 文件,配置 ELK 三个服务:

version: '3'
services:
  elasticsearch:
    image: elasticsearch:6.4.0
    container_name: elasticsearch
    environment:
      - "cluster.name=elasticsearch"  # 设置集群名称
      - "discovery.type=single-node"  # 单节点模式
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"  # JVM 内存设置
    volumes:
      - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins
      - /mydata/elasticsearch/data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
  kibana:
    image: kibana:6.4.0
    container_name: kibana
    links:
      - elasticsearch:es  # 使用 es 域名访问 Elasticsearch
    depends_on:
      - elasticsearch
    environment:
      - "elasticsearch.hosts=http://es:9200"
    ports:
      - 5601:5601
  logstash:
    image: logstash:6.4.0
    container_name: logstash
    volumes:
      - /mydata/logstash/upms-logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch
    links:
      - elasticsearch:es
    ports:
      - 4560-4600:4560-4600

2. 创建挂载目录

执行以下命令创建容器所需的挂载目录:

mkdir -p /mydata/logstash
mkdir -p /mydata/elasticsearch/data
mkdir -p /mydata/elasticsearch/plugins

# 授予 Elasticsearch 数据目录写入权限
chmod 777 /mydata/elasticsearch/data
权限配置

Elasticsearch 数据目录必须设置 777 权限,否则容器启动时会因权限不足而失败。

3. 配置 Logstash 日志采集规则

/mydata/logstash 目录下创建 upms-logstash.conf 文件:

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines  # 使用 JSON Lines 格式解析日志
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    index => "upms-logstash-%{+YYYY.MM.dd}"  # 按日期创建索引
  }
}
配置说明

input 配置 TCP 端口接收日志,output 配置将日志写入 Elasticsearch,索引名称按日期自动分割。

4. 启动 ELK 服务

docker-compose.yml 所在目录执行启动命令:

docker-compose up -d
启动时间

Elasticsearch 首次启动需要几分钟时间进行初始化,请耐心等待服务完全启动。

启动成功后,可以看到三个容器运行状态:

ELK服务状态

5. 安装 Logstash 插件

进入 Logstash 容器安装 JSON Lines 编解码器插件:

# 进入 Logstash 容器
docker exec -it logstash /bin/bash

# 进入 bin 目录
cd /bin/

# 安装 json_lines 插件
logstash-plugin install logstash-codec-json_lines

# 退出容器
exit

# 重启 Logstash 使插件生效
docker restart logstash

6. 访问 Kibana 控制台

浏览器访问 http://宿主机IP:5601 即可打开 Kibana 管理界面。

PIGX 服务整合 Logstash

1. 添加 Maven 依赖

在 UPMS 模块的 pom.xml 中添加 Logstash 依赖:

<!-- 集成 Logstash -->
<dependency>
  <groupId>net.logstash.logback</groupId>
  <artifactId>logstash-logback-encoder</artifactId>
  <version>5.3</version>
</dependency>

2. 配置 Logback 输出

logback-spring.xml 中新增 Logstash appender 配置:

<!-- 输出到 Logstash 的 appender -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
  <!-- Logstash 日志收集端口地址 -->
  <destination>192.168.0.31:4560</destination>
  <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>

<root level="INFO">
  <appender-ref ref="LOGSTASH"/>
</root>
地址配置

destination 中的 IP 地址需要替换为实际部署 Logstash 服务的宿主机地址。

3. 启动服务并查询日志

启动 PIGX UPMS 服务后,在 Kibana 中即可查询到应用日志:

Kibana日志查询索引配置 Kibana日志查询结果

采集多个微服务日志

在生产环境中,通常需要同时采集多个微服务的日志。通过为每个服务分配独立的 TCP 端口,可以实现日志隔离和分类存储。

端口映射

增加新服务时,需要在 docker-compose.yml 中扩展 Logstash 的端口映射范围。

修改 /mydata/logstash/upms-logstash.conf 配置文件:

input {
  tcp {
    add_field => {"service" => "upms"}  # 添加服务标识字段
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
  tcp {
    add_field => {"service" => "auth"}  # 添加服务标识字段
    mode => "server"
    host => "0.0.0.0"
    port => 4561
    codec => json_lines
  }
}

output {
  if [service] == "upms" {
    elasticsearch {
      hosts => "es:9200"
      index => "upms-logstash-%{+YYYY.MM.dd}"
    }
  }
  if [service] == "auth" {
    elasticsearch {
      hosts => "es:9200"
      index => "auth-logstash-%{+YYYY.MM.dd}"
    }
  }
}
多服务配置

通过 add_field 和条件判断,可以将不同服务的日志写入不同的 Elasticsearch 索引,便于日志管理和检索。